{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5371a9bb",
   "metadata": {},
   "source": [
    "# Tracing Walkthrough\n",
    "\n",
    "There are two recommended ways to trace your LangChains:\n",
    "\n",
    "1. Setting the `LANGCHAIN_TRACING` environment variable to \"true\".\n",
    "1. Using a context manager with tracing_enabled() to trace a particular block of code.\n",
    "\n",
    "**Note** if the environment variable is set, all code will be traced, regardless of whether or not it's within the context manager."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "17c04cc6-c93d-4b6c-a033-e897577f4ed1",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"LANGCHAIN_TRACING\"] = \"true\"\n",
    "\n",
    "## Uncomment below if using hosted setup.\n",
    "# os.environ[\"LANGCHAIN_ENDPOINT\"] = \"https://langchain-api-gateway-57eoxz8z.uc.gateway.dev\"\n",
    "\n",
    "## Uncomment below if you want traces to be recorded to \"my_session\" instead of \"default\".\n",
    "# os.environ[\"LANGCHAIN_SESSION\"] = \"my_session\"\n",
    "\n",
    "## Better to set this environment variable in the terminal\n",
    "## Uncomment below if using hosted version. Replace \"my_api_key\" with your actual API Key.\n",
    "# os.environ[\"LANGCHAIN_API_KEY\"] = \"my_api_key\"\n",
    "\n",
    "import langchain\n",
    "from langchain.agents import Tool, initialize_agent, load_tools\n",
    "from langchain.agents import AgentType\n",
    "from langchain.callbacks import tracing_enabled\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.llms import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1b62cd48",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Agent run with tracing. Ensure that OPENAI_API_KEY is set appropriately to run this example.\n",
    "\n",
    "llm = OpenAI(temperature=0)\n",
    "tools = load_tools([\"llm-math\"], llm=llm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bfa16b79-aa4b-4d41-a067-70d1f593f667",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m I need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2^.123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0891804557407723\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n",
      "Final Answer: 1.0891804557407723\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1.0891804557407723'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent = initialize_agent(\n",
    "    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n",
    ")\n",
    "\n",
    "agent.run(\"What is 2 raised to .123243 power?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4829eb1d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2 ^ .123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0891804557407723\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mI now know the answer to the question. \n",
      "Final Answer: 1.0891804557407723\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1.0891804557407723'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Agent run with tracing using a chat model\n",
    "agent = initialize_agent(\n",
    "    tools,\n",
    "    ChatOpenAI(temperature=0),\n",
    "    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "agent.run(\"What is 2 raised to .123243 power?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "76abfd82",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2 ^ .123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0891804557407723\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mI now know the answer to the question. \n",
      "Final Answer: 1.0891804557407723\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 5 ^ .123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.2193914912400514\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mI now know the answer to the question. \n",
      "Final Answer: 1.2193914912400514\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "# Both of the agent runs will be traced because the environment variable is set\n",
    "agent.run(\"What is 2 raised to .123243 power?\")\n",
    "with tracing_enabled() as session:\n",
    "    agent.run(\"What is 5 raised to .123243 power?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fe833c33-033f-4806-be0c-cc3d147db13d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 5 ^ .123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.2193914912400514\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mI now know the answer to the question. \n",
      "Final Answer: 1.2193914912400514\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2 ^ .123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0891804557407723\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3mI now know the answer to the question. \n",
      "Final Answer: 1.0891804557407723\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1.0891804557407723'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Now, we unset the environment variable and use a context manager.\n",
    "if \"LANGCHAIN_TRACING\" in os.environ:\n",
    "    del os.environ[\"LANGCHAIN_TRACING\"]\n",
    "\n",
    "# here, we are writing traces to \"my_test_session\"\n",
    "with tracing_enabled(\"my_session\") as session:\n",
    "    assert session\n",
    "    agent.run(\"What is 5 raised to .123243 power?\")  # this should be traced\n",
    "\n",
    "agent.run(\"What is 2 raised to .123243 power?\")  # this should not be traced"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b34105a4-be8e-46e4-8abe-01adba3ba727",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\n",
      "\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 3^0.123\u001b[0m\u001b[32;1m\u001b[1;3mI need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2^0.123\u001b[0m\u001b[32;1m\u001b[1;3mAny number raised to the power of 0 is 1, but I'm not sure about a decimal power.\n",
      "Action: Calculator\n",
      "Action Input: 1^.123\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.1446847956963533\u001b[0m\n",
      "Thought:\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0889970153361064\u001b[0m\n",
      "Thought:\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0\u001b[0m\n",
      "Thought:\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1.0'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The context manager is concurrency safe:\n",
    "import asyncio\n",
    "\n",
    "if \"LANGCHAIN_TRACING\" in os.environ:\n",
    "    del os.environ[\"LANGCHAIN_TRACING\"]\n",
    "\n",
    "questions = [f\"What is {i} raised to .123 power?\" for i in range(1, 4)]\n",
    "\n",
    "# start a background task\n",
    "task = asyncio.create_task(agent.arun(questions[0]))  # this should not be traced\n",
    "with tracing_enabled() as session:\n",
    "    assert session\n",
    "    tasks = [agent.arun(q) for q in questions[1:3]]  # these should be traced\n",
    "    await asyncio.gather(*tasks)\n",
    "\n",
    "await task"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c552a5dd-cbca-48b9-90e6-930076006f78",
   "metadata": {},
   "source": [
    "## [Beta] Tracing V2\n",
    "\n",
    "We are rolling out a newer version of our tracing service with more features coming soon. Here are the instructions on how to use it to trace your runs.\n",
    "\n",
    "To use, you can use the `tracing_v2_enabled` context manager or set `LANGCHAIN_TRACING_V2 = 'true'`\n",
    "\n",
    "**Option 1 (Local)**: \n",
    "* Run the local LangChainPlus Server\n",
    "```\n",
    "pip install --upgrade langchain\n",
    "langchain plus start\n",
    "```\n",
    "\n",
    "**Option 2 (Hosted)**:\n",
    "* After making an account an grabbing a LangChainPlus API Key, set the `LANGCHAIN_ENDPOINT` and `LANGCHAIN_API_KEY` environment variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "87027b0d-3a61-47cf-8a65-3002968be7f9",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n",
    "# os.environ[\"LANGCHAIN_ENDPOINT\"] = \"https://api.langchain.plus\"  # Uncomment this line if you want to use the hosted version\n",
    "# os.environ[\"LANGCHAIN_API_KEY\"] = \"<YOUR-LANGCHAINPLUS-API-KEY>\"  # Uncomment this line if you want to use the hosted version."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5b4f49a2-7d09-4601-a8ba-976f0517c64c",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import langchain\n",
    "from langchain.agents import Tool, initialize_agent, load_tools\n",
    "from langchain.agents import AgentType\n",
    "from langchain.callbacks import tracing_enabled\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.llms import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "029b4a57-dc49-49de-8f03-53c292144e09",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Agent run with tracing. Ensure that OPENAI_API_KEY is set appropriately to run this example.\n",
    "\n",
    "llm = OpenAI(temperature=0)\n",
    "tools = load_tools([\"llm-math\"], llm=llm)\n",
    "agent = initialize_agent(\n",
    "    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "91a85fb2-6027-4bd0-b1fe-2a3b3b79e2dd",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m I need to use a calculator to solve this.\n",
      "Action: Calculator\n",
      "Action Input: 2^.123243\u001b[0m\n",
      "Observation: \u001b[36;1m\u001b[1;3mAnswer: 1.0891804557407723\u001b[0m\n",
      "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n",
      "Final Answer: 1.0891804557407723\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'1.0891804557407723'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent.run(\"What is 2 raised to .123243 power?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2291e9f-02f3-4b55-bd3d-d719de815df1",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
